package com.xhs.message;

import com.xhs.utils.TraceIdUtil;
import lombok.Data;

/**
 * @desc: 标准响应报文，在调用接口服务时统一响应的报文信息
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-8-30 020 21:38
 * @version: JDK 1.8
 */
@Data
public class ReturnResult<T> {
    /**
     * 返回状态码
     */
    private Integer code;

    /**
     * 返回msg
     */
    private String msg;

    /**
     * 请求跟踪ID（日志链路追踪）
     */
    private String traceId;

    /**
     * 是否成功
     */
    private boolean success;

    /**
     * 响应数据（支持以下类型）：
     * - 基础类型（String/Number/Boolean）
     * - 集合类型（List/Set）
     * - 键值对（Map）
     * - 自定义对象（POJO）
     * - 分页对象（PageResult）
     * - 空值（null）
     */
    private T data;

    /**
     * 无参构造方法
     */
    public ReturnResult() {
        this.traceId = TraceIdUtil.getTraceId();
    }

    /**
     * 有参构造方法
     *
     * @param code 状态码
     * @param msg  提示信息
     */
    public ReturnResult(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
        this.traceId = TraceIdUtil.getTraceId();
    }

    /**
     * 有参构造方法
     *
     * @param code 状态码
     * @param msg  提示信息
     * @param data 数据
     */
    public ReturnResult(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
        this.traceId = TraceIdUtil.getTraceId();
    }

    //========================================== 成功响应 ↓ ==========================================

    /**
     * 成功响应（无数据）
     */
    public static <T> ReturnResult<T> success() {
        return new ReturnResult<>(
                Result.SUCCESS.getCode(),
                Result.SUCCESS.getMsg(),
                null);
    }

    /**
     * 成功响应（带自定义消息）
     */
    public static <T> ReturnResult<T> success(String msg) {
        return new ReturnResult<>(
                Result.SUCCESS.getCode(),
                msg,
                null);
    }

    /**
     * 成功响应（带数据）
     */
    public static <T> ReturnResult<T> success(T data) {
        return new ReturnResult<>(
                Result.SUCCESS.getCode(),
                Result.SUCCESS.getMsg(),
                data);
    }

    /**
     * 成功响应（带消息和数据）
     */
    public static <T> ReturnResult<T> success(String msg, T data) {
        return new ReturnResult<>(
                Result.SUCCESS.getCode(),
                msg,
                data);
    }
    //========================================== 成功响应 ↑ ==========================================

    //========================================== 失败响应 ↓ ==========================================

    /**
     * 失败响应（默认错误）
     */
    public static <T> ReturnResult<T> error() {
        return new ReturnResult<>(
                Result.ERROR.getCode(),
                Result.ERROR.getMsg(),
                null);
    }

    /**
     * 失败响应（自定义错误消息）
     */
    public static <T> ReturnResult<T> error(String msg) {
        return new ReturnResult<>(
                Result.ERROR.getCode(),
                msg,
                null);
    }

    /**
     * 失败响应（带错误数据）
     */
    public static <T> ReturnResult<T> error(T errorData) {
        return new ReturnResult<>(
                Result.ERROR.getCode(),
                Result.ERROR.getMsg(),
                errorData);
    }

    /**
     * 失败响应（带消息和数据）
     */
    public static <T> ReturnResult<T> error(String msg, T errorData) {
        return new ReturnResult<>(
                Result.ERROR.getCode(),
                msg,
                errorData);
    }

    /**
     * 失败响应（带消息和数据）
     */
    public static <T> ReturnResult<T> error(Integer code, String msg) {
        return new ReturnResult<>(
                code,
                msg,
                null);
    }

    /**
     * 失败响应（完全自定义）
     */
    public static <T> ReturnResult<T> error(Integer code, String msg, T errorData) {
        return new ReturnResult<>(code, msg, errorData);
    }
    //========================================== 失败响应 ↑ ==========================================

    /**
     * 构建枚举响应（推荐统一状态码管理）
     */
    public static <T> ReturnResult<T> build(Result result) {
        return new ReturnResult<>(result.getCode(), result.getMsg(), null);
    }

    public static <T> ReturnResult<T> build(Result result, T data) {
        return new ReturnResult<>(result.getCode(), result.getMsg(), data);
    }

    //========================================== 链式调用增强 ↓ ==========================================

    /**
     * 设置数据（链式调用）
     */
    public ReturnResult<T> setData(T data) {
        this.data = data;
        return this;
    }

    /**
     * 设置消息（链式调用）
     */
    public ReturnResult<T> setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    /**
     * 判断是否成功
     */
    public boolean isSuccess() {
        return Result.SUCCESS.getCode().equals(this.code);
    }
    //========================================== 链式调用增强 ↑ ==========================================
}
